﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

//1.普通函数与函数模板的区别；
template<class T>
T myPlusTemplate(T a, T b)
{
	return a + b;
}

int myPlus(int a, int b)
{
	return a + b;
}
//5.普通函数和函数模板的调用规则；
template<class T>
void myPrintInt(T a, T b)
{
	cout << "模板调用的myPrintInt！" << endl;
}

template<class T>
void myPrintInt(T a, T b, T c)
{
	cout << "模板调用的myPrintInt(a,b,c)！" << endl;
}
//11.通过模板生成的函数，叫模板函数；
/*
void myPrintInt(int a, int b, int c)
{

}*/

void myPrintInt(int a, int b)
{
	cout << "普通函数调用myPrintInt！" << endl;
}
//7.只有myPrintInt的声明，而没有实现，则编译出错；1 个无法解析的外部命令
void myPrintInt(int a, int b);

void testMyTemplate()
{
	int a = 10;
	int b = 20;
	//3.a=97
	char c = 'c';

	myPlusTemplate(a, b);
	//2.类型推导不出来，函数模板不可以进行隐式类型转换；
	//myPlusTemplate(a, c);

	myPlus(a, b);
	//4.普通函数，可以进行隐式类型转换；
	cout << myPlus(a, c) << endl;//10+99=109

	//6.如果出现重载，优先使用普通函数调用；如果没有实现，出现错误；1 个无法解析的外部命令
	//myPrintInt(a, b);//普通函数调用myPrintInt！

	//8.如果想强制调用模板，那么可以使用空参数列表；
	myPrintInt<>(a, b);//模板调用的myPrintInt！

	//9.函数模板可以发生重载；
	int d = 30;
	myPrintInt(a, b, d);//模板调用的myPrintInt(a,b,c)！

	//10.如果函数模板可以产生更好的匹配，那么优先调用函数模板；
	char e = 'e';
	myPrintInt(c, e);//模板调用的myPrintInt！
}

//main299：函数模板和普通函数的区别及调用规则
int main299()
{
	testMyTemplate();

	system("pause");
	return EXIT_SUCCESS;
}